package jjj.card;

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import javax.swing.*;
import java.awt.Color;
import java.awt.event.ActionEvent;

public class SpiderMenuBarTest {
    private SpiderMenuBar menuBar;
    private Spider spiderMock;

    @Before
    public void setUp() {
        spiderMock = new Spider();
        menuBar = new SpiderMenuBar(spiderMock);
    }

    /**
     * 测试createThemeMenuItem方法
     * 判定覆盖:
     * 1. 验证菜单项是否正确创建
     * 2. 验证点击事件是否正确设置背景色
     */
    @Test
    public void testCreateThemeMenuItem() {
        // 测试创建粉色主题菜单项
        String name = "粉色";
        Color color = Color.PINK;
        JMenuItem menuItem = menuBar.createThemeMenuItem(name, color);

        // 验证菜单项属性
        assertNotNull("菜单项不应为空", menuItem);
        assertEquals("菜单项名称应匹配", name, menuItem.getText());

        // 模拟点击事件
        ActionEvent mockEvent = new ActionEvent(menuItem, ActionEvent.ACTION_PERFORMED, "command");
        menuItem.getActionListeners()[0].actionPerformed(mockEvent);

        // 验证背景色是否正确设置
        assertEquals("背景色应该更新为指定颜色", color, spiderMock.getContentPane().getBackground());
    }

    /**
     * 测试Show内部类的run方法
     * 判定覆盖:
     * 1. 验证线程是否正确执行showEnableOperator
     */
    @Test
    public void testShowRun() {
        SpiderMenuBar.Show show = menuBar.new Show();
        show.run();
        // 由于showEnableOperator方法在Spider类中是可见的，
        // 我们可以通过观察Spider对象的状态来间接验证其执行
        // 这里主要验证线程能否正常执行而不抛出异常
        assertTrue("Show线程应该正常执行", true);
    }

    /**
     * 测试构造函数中的菜单项初始化
     * 判定覆盖:
     * 1. 验证菜单项是否正确添加到菜单栏
     * 2. 验证难度选项的互斥性
     */
    @Test
    public void testMenuInitialization() {
        // 验证主要菜单是否存在
        assertEquals("应该有2个主菜单", 2, menuBar.getMenuCount());

        // 验证难度选项的互斥性
        ButtonGroup group = new ButtonGroup();
        group.add(menuBar.jRMItemEasy);
        group.add(menuBar.jRMItemNormal);
        group.add(menuBar.jRMItemHard);

        // 测试默认选中状态
        assertTrue("简单模式应该默认选中", menuBar.jRMItemEasy.isSelected());
        assertFalse("中级模式不应该选中", menuBar.jRMItemNormal.isSelected());
        assertFalse("高级模式不应该选中", menuBar.jRMItemHard.isSelected());

        // 模拟选择中级难度
        menuBar.jRMItemNormal.setSelected(true);
        assertTrue("中级模式应该被选中", menuBar.jRMItemNormal.isSelected());
        assertFalse("简单模式应该取消选中", menuBar.jRMItemEasy.isSelected());
        assertFalse("高级模式不应该选中", menuBar.jRMItemHard.isSelected());
    }
}